package object3;

/**
 * 代码块使用细节
 */
public class CodeBlockDetail01 {

    public static void main(String[] args) {
        /*
            1)static代码块也叫静态代码块，作用是对类进行初始化，随着类的加载而执行，并且只执行一次
              如果是普通代码块，每创建一个对象，就执行
            2)类什么时候被加载
                1.创建对象实例时(new)
                2.创建子类对象实例，父类也会被加载(子类也会继承父类的代码块)
                3.使用类的静态成员时(静态属性、静态方法)
            3)普通的代码块，在创建对象实例时，会被隐式的调用
              被创建一次就会调用一次
              如果只是使用类的静态成员时，普通代码块并不会执行
         */
        /*
            tips：
            static代码块是类加载时执行，只会执行一次
            普通代码块是在创建对象时调用，创建一次调用一次
         */

        //创建对象实例时，先加载父类，再加载子类
        AA aa = new AA();
        /*
            BB 的静态代码1被执行...
            AA 的静态代码块1被执行...
         */

        //使用类的静态成员时(静态属性、静态方法)
        System.out.println(Cat.n1);
        /*
            Animal 的静态代码块1被执行...
            Cat 的静态代码1被执行...
            999
         */

        //static代码块是在类加载时执行且只会执行一次
        DD dd = new DD();
        DD dd1 = new DD();
        /*
            DD 的静态代码1被执行...
            DD 的普通代码块...
            DD 的普通代码块...
         */
        System.out.println(DD.n1);
        /*
            8888
         */

    }
}

class DD {

    public static int n1 = 8888;//静态属性

    //静态代码块
    static {
        System.out.println("DD 的静态代码1被执行...");
    }

    //普通代码块，在new对象时被调用，且每创建一个对象就调用一次
    //可以理解成，普通代码块是对构造器的补充
    {
        System.out.println("DD 的普通代码块...");
    }

}

class Animal {

    //静态代码块
    static {
        System.out.println("Animal 的静态代码块1被执行...");
    }

}

class Cat extends Animal {

    public static int n1 = 999;//静态属性

    //静态代码块
    static {
        System.out.println("Cat 的静态代码1被执行...");
    }
}

class BB {

    //静态代码块
    static {
        System.out.println("BB 的静态代码1被执行...");
    }
}

class AA extends BB {

    //静态代码块
    static {
        System.out.println("AA 的静态代码块1被执行...");
    }
}